from util import *

class Const:
    def __init__(self):
        pass
        
    def path(self):
        """ 获取根path """
        return './'

    def publicPath(self):
        """ 图片资源path """
        return const.path() + 'public/'

    def tmpPath(self):
        """ 临时path """
        return const.path() + 'tmp/'

    
    def picLoop(self, url, threshold=0.8, size=(0, 0, 0, 0), timeSec = 600, img=None, template=None):
        """ 带重启的找图

        :param url: 模板图片位置（带后缀）
        :param threshold: 匹配度 0~1的小数 数字越高越匹配        默认0.8
        :param size: 需要截图的框框                             默认(0, 0, 0, 0) - 全图截图
        :param timeSec: 等待时间（秒）                          默认600
        :param img: cv2格式的截图                               默认None - 根据size进行截图
        :param template: cv2格式的模板图片                      默认None - 根据url读取模板图片
        :returns: 中心点x, y                                    (-2, -2) - 没找到
        :raises restart: 重启脚本
        """
        x, y = util.findPicLoop(url, threshold=threshold, size=size, timeSec = timeSec, img = img, template = template)
        if x==-2 and y==-2:
            util.logOut(__file__,'picLoop没找到图 需要重启脚本！！！！！！')
            raise ValueError('restart')
        return (x, y)
    
    def picMulLoop(self, urlList, timeSec = 600):
        """ 带重启的找多图

        :param urlList: 模板图片位置（带后缀）的数组
        :param timeSec: 等待时间（秒）                          默认600
        :returns: 中心点x, y, url                               (-2, -2, "") - 没找到
        :raises restart: 重启脚本
        """
        x, y, url = util.findMulPicLoop(urlList, timeSec)
        if x==-2 and y==-2 and len(url)==0:
            util.logOut(__file__,'picMulLoop没找到图 需要重启脚本！！！！！！')
            raise ValueError('restart')
        return (x, y, url)

    def backMainProcess(self):
        """ 返回主页面 """
        util.logOut(__file__,'backMainProcess 返回主页面开始')
        isBack = False # 是否返回主页面

        while True:
            list = [
                const.publicPath() + 'bmp/home.jpg', # home键
                const.publicPath() + 'beacon/beacon_home.jpg', # 大世界里的home键
                const.publicPath() + 'bmp/i_known.jpg', # 大世界通知弹框
                const.publicPath() + 'bmp/quit.jpg', # 右上角红色叉叉
                const.publicPath() + 'bmp/get_items.bmp', # 收到物品
                const.publicPath() + 'bmp/salvage.jpg', # 收到新船
            ]
            x, y, url = util.findMulPicLoop([
                *list,
                const.publicPath() + 'bmp/weigh anchor.jpg', # 主页面的出击
            ], 7)
            if url in list:
                if url == const.publicPath() + 'bmp/salvage.jpg':
                    util.click(200, 200)
                else:
                    util.click(x, y)
                time.sleep(1)
                continue
            elif url == const.publicPath() + 'bmp/weigh anchor.jpg':
                util.logOut(__file__,'backMainProcess 返回主页面结束')
                isBack = True
                break
            else:
                util.logOut(__file__,'backMainProcess 返回主页面结束 失败')
                isBack = False
                break

        return isBack

    def retireProcess(self, first = 1, second = 2, third = 4, forth = 3, fifth = 2, skipOption = False):
        """ 退役船

        :param first: 退役的第一个选项                       默认1 - 退役sr船
        :param second: 退役的第二个选项                      默认2 - 退役r船
        :param third: 退役的第三个选项                       默认4 - 不退役
        :param forth: 保留多余的船                           默认3 - 不保留
        :param fifth: 保留突破的船                           默认2 - 保留至满破
        :param skipOption: 是否跳过退役选项                  默认False - 不跳过
        """
        util.logOut(__file__,'retireProcess 退役步骤开始')
        const.picLoop(const.publicPath() + 'bmp/retire.jpg', size=(0, 0, 563, 483))

        # 1 筛选符合正常情况
        if util.cmpColor(500, 20, [166, 123, 79]): # 常用按钮是否亮起
            util.click(500, 20)
        
        if util.cmpColor(779, 21, [166,108,63]): # 筛选按钮是否亮起
            util.click(779, 21)
            const.picLoop(const.publicPath() + 'bmp/is_filter.jpg')
            util.click(348, 61) # 等级
            util.click(240, 108) # 全部
            util.click(240, 196) # 全阵营
            util.click(240, 284) # 全部
            util.click(240, 332) # 无限制
            x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
            util.click(x, y)

        # 2 一键退役设置
        if not skipOption:
            x, y = const.picLoop(const.publicPath() + 'bmp/retire_option.jpg')
            util.click(x, y)
            const.picLoop(const.publicPath() + 'bmp/is_retire_option.jpg')
            if first != -1:
                util.click(515 + (4 - 1) * 50, 158)
                util.click(515 + (first - 1) * 50, 158)
            if second != -1:
                util.click(515 + (4 - 1) * 50, 197)
                util.click(515 + (second - 1) * 50, 197)
            if third != -1:
                util.click(515 + (4 - 1) * 50, 238)
                util.click(515 + (third - 1) * 50, 238)
            if forth != -1:
                util.click(506 + (forth - 1) * 79, 305)
            if fifth != -1:
                util.click(506 + (fifth - 1) * 79, 373)
            x, y = const.picLoop(const.publicPath() + 'bmp/quit.jpg')
            util.click(x, y)

        # 3 一键退役
        while True:
            time.sleep(2)
            x, y = const.picLoop(const.publicPath() + 'bmp/retire.jpg', size=(0, 0, 563, 483))
            util.click(x, y)
            time.sleep(1)

            # 判断是否没的退役
            noRetire = False # 是否没的退役
            list = util.getWords((343, 207 , 525, 235))
            if len(list) != 0:
                for m in list:
                    if '没找到' in m:
                        noRetire = True
                        util.logOut(__file__,'没找到符合条件的舰船')
                        break
            if noRetire:
                break

            const.picLoop(const.publicPath() + 'bmp/retire_information.jpg')
            x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
            util.click(x, y)
            
            x, y, url = const.picMulLoop([
                const.publicPath() + 'bmp/is_sr_warn.jpg', # 紫船二次确认
                const.publicPath() + 'bmp/get_items.bmp' # 正常退役
            ])
            if url == const.publicPath() + 'bmp/is_sr_warn.jpg':
                x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/get_items.bmp')
                util.click(x, y)
                time.sleep(.800)
            elif url == const.publicPath() + 'bmp/get_items.bmp':
                util.click(x, y)
                time.sleep(.800)
            
            x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
            util.click(x, y)
            time.sleep(.800)
            x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
            util.click(x, y)
            x, y = const.picLoop(const.publicPath() + 'bmp/get_items.bmp')
            util.click(x, y)

        # 4 退出这个界面
        x, y = const.picLoop(const.publicPath() + 'bmp/back.jpg')
        util.click(x, y)
        util.logOut(__file__,'retireProcess 退役步骤结束')

    def anchorProcess(self, zilvFight = True, callSubmarine = True, formation = 'double'):
        """ 出击到结束的过程

        :param zilvFight: 是否自律                       默认True - 自律
        :param callSubmarine: 是否自动召唤潜艇            默认True - 自动召唤潜艇
        :param formation: 阵型                           默认double - 轮形    cross - 防空    single - 单纵
        """
        util.logOut(__file__,'anchorProcess 出击步骤开始')
        time.sleep(.800)

        # 1、出击界面

        # 1.1、今日不再提示
        x, y, url = const.picMulLoop([
            const.publicPath() + 'bmp/anchor.bmp', # 正常出击
            const.publicPath() + 'bmp/quit.jpg', # 自律 今日不再提示
        ])
        if url == const.publicPath() + 'bmp/anchor.bmp':
            pass
        elif url == const.publicPath() + 'bmp/quit.jpg':
            util.click(x, y)
            util.logOut(__file__,'今日不再提示')

        anchorImg = util.grab()
        # 1.2、队伍自律
        if zilvFight:
            if util.isFindPic(const.publicPath() + 'bmp/zilv_fight_off.jpg', img = anchorImg):
                x, y = const.picLoop(const.publicPath() + 'bmp/zilv_fight_off.jpg', img = anchorImg)
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/zilv_fight_on.jpg')
                anchorImg = util.grab()
        else:
            if util.isFindPic(const.publicPath() + 'bmp/zilv_fight_on.jpg', img = anchorImg):
                x, y = const.picLoop(const.publicPath() + 'bmp/zilv_fight_on.jpg', img = anchorImg)
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/zilv_fight_off.jpg')
                anchorImg = util.grab()     

        # 1.3、潜艇自律
        if zilvFight:
            if callSubmarine:
                if util.isFindPic(const.publicPath() + 'bmp/call_submarine_off.jpg', img = anchorImg):
                    x, y = const.picLoop(const.publicPath() + 'bmp/call_submarine_off.jpg', img = anchorImg)
                    util.click(x, y)
                    const.picLoop(const.publicPath() + 'bmp/call_submarine_on.jpg')
                    anchorImg = util.grab()
            else:
                if util.isFindPic(const.publicPath() + 'bmp/call_submarine_on.jpg', img = anchorImg):
                    x, y = const.picLoop(const.publicPath() + 'bmp/call_submarine_on.jpg', img = anchorImg)
                    util.click(x, y)
                    const.picLoop(const.publicPath() + 'bmp/call_submarine_off.jpg')
                    anchorImg = util.grab()

        # 1.4 阵型
        x, y = 35, 365
        if util.isFindPic(const.publicPath() + 'bmp/formation_double.jpg', img = anchorImg):
            url = const.publicPath() + 'bmp/formation_double.jpg'
        elif util.isFindPic(const.publicPath() + 'bmp/formation_cross.jpg', img = anchorImg):
            url = const.publicPath() + 'bmp/formation_cross.jpg'
        elif util.isFindPic(const.publicPath() + 'bmp/formation_single.jpg', img = anchorImg):
            url = const.publicPath() + 'bmp/formation_single.jpg'
        else:
            url = ''
        # x, y, url = const.picMulLoop([
        #     const.publicPath() + 'bmp/formation_double.jpg',
        #     const.publicPath() + 'bmp/formation_cross.jpg',
        #     const.publicPath() + 'bmp/formation_single.jpg',
        # ])
        if formation == 'double':
            if url == const.publicPath() + 'bmp/formation_double.jpg':
                pass
            elif url == const.publicPath() + 'bmp/formation_cross.jpg':
                util.click(x, y)
                time.sleep(.500)
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/formation_double.jpg')
            elif url == const.publicPath() + 'bmp/formation_single.jpg':
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/formation_double.jpg')
        elif formation == 'cross':
            if url == const.publicPath() + 'bmp/formation_double.jpg':
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/formation_cross.jpg')
            elif url == const.publicPath() + 'bmp/formation_cross.jpg':
                pass
            elif url == const.publicPath() + 'bmp/formation_single.jpg':
                util.click(x, y)
                time.sleep(.500)
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/formation_cross.jpg')
        elif formation == 'single':
            if url == const.publicPath() + 'bmp/formation_double.jpg':
                util.click(x, y)
                time.sleep(.500)
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/formation_single.jpg')
            elif url == const.publicPath() + 'bmp/formation_cross.jpg':
                util.click(x, y)
                const.picLoop(const.publicPath() + 'bmp/formation_single.jpg')
            elif url == const.publicPath() + 'bmp/formation_single.jpg':
                pass
        else:
            pass

        # 1.5、点击出击
        def anchor():
            x, y = const.picLoop(const.publicPath() + 'bmp/anchor.bmp')
            time.sleep(0.800)
            util.click(x, y)
            
        anchor()

        time.sleep(.800)
        # 1.6、红脸判断
        list = util.getWords((237, 201 , 627, 263))
        if len(list) != 0 and '低心情' in list[0]:
            util.logOut(__file__,'红脸')
            util.logOut(__file__,'等待30分钟，回心情...')
            time.sleep(60*30)
            x, y = const.picLoop(const.publicPath() + 'bmp/quit.jpg')
            util.click(x, y)

        # 1.7、船坞已满判断
        x, y = util.findPic(const.publicPath() + 'bmp/zhengli.jpg')
        if x!=-1 and y!=-1:
            util.logOut(__file__,'船坞已满')
            util.click(x, y)
            const.retireProcess(third = 3)
            time.sleep(.800)
            anchor()

        # 2、自律打完后的结算
        #S
        x, y = const.picLoop(const.publicPath() + 'bmp/S.bmp',0.6)
        time.sleep(1.200)
        util.click(x, y)
        #get_items
        time.sleep(.800)
        util.click(684,308)
        time.sleep(1.600)
        #打捞到sr或ssr（不存在的）
        if util.isFindPic(const.publicPath() + 'bmp/salvage.jpg'):
            util.logOut(__file__,'打捞到sr或者ssr')
            if util.isFindPic(const.publicPath() + 'bmp/new.jpg'):
                util.logOut(__file__,'打捞到新船！！！！')
                util.click(44,387)
                time.sleep(2)
            util.click(684,308)
            time.sleep(2)
            
        util.click(684,308)
        #exp2
        x, y = const.picLoop(const.publicPath() + 'bmp/exp2.bmp')
        util.click(x, y)

        # 3、结算后特殊情况判断
        time.sleep(3)
        #作战失败 特殊
        xx, yy = util.findPic(const.publicPath() + 'bmp/death.jpg')
        if xx!=-1 and yy!=-1:
            util.logOut(__file__,'作战失败')
            util.click(xx,yy)
        time.sleep(3)
        #紧急委托 特殊
        xx, yy = util.findPic(const.publicPath() + 'bmp/OK.jpg')
        if xx!=-1 and yy!=-1:
            util.logOut(__file__,'紧急委托')
            util.click(xx,yy)
        util.logOut(__file__,'anchorProcess 出击步骤结束')
    
    def chapterProcess(self, chapterNum ,type):
        """ 进入出击章节

        :param chapterNum: 章节数字
        :param type: 普通'N' 困难'H'
        """
        util.logOut(__file__,'chapterProcess 进入出击章节步骤开始')
        chapterPos = (82, 43,141, 75)
        prevX , prevY = 33, 251
        nextX , nextY = 826, 251
        #返回主页面
        const.backMainProcess()
        #进入出击界面
        x, y = const.picLoop(const.publicPath() + 'bmp/weigh anchor.jpg')
        util.click(x, y)

        x, y, url = const.picMulLoop([
            const.publicPath() + 'bmp/main battleline.jpg', # 演习
            const.publicPath() + 'bmp/withdraw.jpg', # 在图里
        ])
        if url == const.publicPath() + 'bmp/main battleline.jpg':
            pass
        elif url == const.publicPath() + 'bmp/withdraw.jpg':
            util.click(x, y)
            x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
            util.click(x, y)
            const.backMainProcess()
            x, y = const.picLoop(const.publicPath() + 'bmp/weigh anchor.jpg')
            util.click(x, y)
            x, y = const.picLoop(const.publicPath() + 'bmp/main battleline.jpg')
        util.click(x, y)
        const.picLoop(const.publicPath() + 'bmp/exercise.jpg')

        #困难模式
        if type == 'H':
            x, y = util.findPic(const.publicPath() + 'bmp/hardmode.jpg')
            if x!=-1 and y!=-1:
                util.click(x, y)
                time.sleep(.2)
        elif type == 'N':
            x, y = util.findPic(const.publicPath() + 'bmp/nomalmode.jpg')
            if x!=-1 and y!=-1:
                util.click(x, y)
                time.sleep(.2)
        else:
            util.logOut(__file__,'chapterProcess的type有误')
        #第chapterNum章
        list = util.getNumbers(chapterPos)
        if len(list) > 0:
            tempNum = int(list[0])
            if tempNum != chapterNum:
                #判断当前章节 前往第chapterNum章
                chapterNumNow = tempNum
                while chapterNumNow != chapterNum:
                    if chapterNumNow < chapterNum:
                        util.click(nextX,nextY)
                        chapterNumNow += 1
                        time.sleep(.500)
                    else:
                        util.click(prevX,prevY)
                        chapterNumNow -= 1
                        time.sleep(.500)
        
        util.logOut(__file__,'chapterProcess 进入出击章节步骤结束')

    def intoStageProcess(self,
        xx, yy, 
        first = -1, second = -1, 
        isWeek = True, 
        isBook = True, 
        third = -1, 
        firstWork = 1, 
        thirdWork = 1
    ):
        """ 进入stage

        :param xx, yy: stage的位置
        :param first: 第一个舰队选择 -1不动 0清空          默认-1 - 不动
        :param second: 第二个舰队选择 -1不动 0清空         默认-1 - 不动
        :param isWeek: 是否周回模式                       默认True - 选择周回模式
        :param isBook: 是否使用双倍书                     默认True - 使用双倍书
        :param third: 潜艇选择 -1不动 0清空               默认-1 - 不动
        :param firstWork: 第一个舰队职责                  默认1 - 道中
        :param thirdWork: 潜艇职责                        默认1 - 自动出击
        """
        util.logOut(__file__,'intoStageProcess 进入stage步骤开始')
        # 1、立即前往界面
        def tempInto(x, y):
            util.click(x, y)
            const.picLoop(const.publicPath() + 'bmp/start chapter.jpg')
            # 周回模式
            if isWeek:
                # if not 周回模式on and 周回模式off
                if not util.cmpColor(713, 402, [255, 255, 255]) and util.cmpColor(668, 402, [255, 255, 255]):
                    util.click(668, 402)
                # 开启自律开关
                time.sleep(1)
                if not util.cmpColor(592, 404, [153, 233, 88]): # 自律寻敌是否没亮起
                    util.click(592, 404)
            else:
                # 还会有人不要周回模式的？
                # if not 周回模式off and 周回模式on
                if not util.cmpColor(668, 402, [255, 255, 255]) and util.cmpColor(713, 402, [255, 255, 255]):
                    util.click(668, 402)
            
            x, y = const.picLoop(const.publicPath() + 'bmp/start chapter.jpg')
            util.click(x, y)
            time.sleep(.800)
        time.sleep(4.00)
        tempInto(xx,yy)

        # 船坞已满特殊
        util.logOut(__file__,'船坞已满判断 开始')
        time.sleep(.500)
        x, y = util.findPic(const.publicPath() + 'bmp/zhengli.jpg')
        if x!=-1 and y!=-1:
            util.logOut(__file__,'船坞已满')
            util.click(x, y)
            const.retireProcess(third=3)
            time.sleep(4.000)
            tempInto(xx,yy)

        # 2、舰队选择界面
        const.picLoop(const.publicPath() + 'bmp/start chapter.jpg')

        # 2.1 双倍书
        if util.isFindPic(const.publicPath() + 'bmp/is_book.jpg'): # 有双倍书才考虑
            if isBook:
                if not util.isFindPic(const.publicPath() + 'bmp/book_on.jpg'):
                    util.click(628, 413) # 勾的位置
            else:
                if util.isFindPic(const.publicPath() + 'bmp/book_on.jpg'):
                    util.click(628, 413) # 勾的位置
        
        # 2.2 编队
        if first != -1 and second != -1:
            #清空 第二个队伍
            util.click(767, 220)
            time.sleep(.200)
            #选择1 
            util.click(713, 131)
            time.sleep(.200)
            #第first队伍
            util.click(740, 176 + (first - 1) * 28)
            time.sleep(.200)
            if second != 0:
                #选择2
                util.click(714, 223)
                time.sleep(.200)
                #第second队伍
                util.click(740, 266 + (second - 1) * 28)
        if third != -1 and util.isFindPic(const.publicPath() + 'bmp/advice.jpg', size=(682, 288, 804, 368)):
            # 清空 3
            util.click(775, 321)
            time.sleep(.200)
            if third != 0:
                # 选择 3 
                util.click(713, 323)
                time.sleep(1)
                # 第third队伍
                util.click(740, 367 + (third - 1) * 28)
                time.sleep(.200)

        # 2.3 职能
        if isWeek: # 只有周回才有职能
            util.click(821, 272) # 职能按钮
            if firstWork == 1:
                util.click(341, 135) # 道中
            elif firstWork == 2:
                util.click(434, 135) # boss
            elif firstWork == 3:
                util.click(567, 135) # 全部
            elif firstWork == 4:
                util.click(636, 135) # 待机
            
            if thirdWork == 1:
                util.click(397, 323) # 自动召唤潜艇
            elif thirdWork == 2:
                util.click(609, 323) # 待机

        # 3 立即前往
        x, y = const.picLoop(const.publicPath() + 'bmp/start chapter.jpg')
        util.click(x, y)

        util.logOut(__file__,'intoStageProcess 进入stage步骤结束')

    def restartProcess(self, needGrab = True):
        """ 重启

        :param needGrab: 重启前是否需要截图保存          默认True - 需要
        """
        util.logOut(__file__,'restartProcess 重启脚本开始')

        if needGrab:
            # 重启前截图 用于定位错误
            imageName = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())
            util.grab(imageName=imageName)
            util.logOut(__file__,'已保存图片: .\\tmp\\{}.png'.format(imageName))
        util.adb('shell am force-stop com.bilibili.azurlane')
        util.adb('shell am start -n com.bilibili.azurlane/com.manjuu.azurlane.MainActivity')

        while True:
            x, y, url = const.picMulLoop([
                const.publicPath() + 'bmp/agree.jpg',
                const.publicPath() + 'bmp/OK_orange.jpg',
                const.publicPath() + 'bmp/login.jpg',
            ])
            if url == const.publicPath() + 'bmp/agree.jpg': # 隐私协议
                util.click(656, 299) # 拖动滑动条
                time.sleep(.800)
                util.click(x, y)
                continue
            elif url == const.publicPath() + 'bmp/OK_orange.jpg': # 数据更新
                util.click(x, y)
                continue
            elif url == const.publicPath() + 'bmp/login.jpg':
                break

        findLoginCnt = 3
        while findLoginCnt != 0:
            util.click(200, 200)
            x, y = util.findPic(const.publicPath() + 'bmp/login.jpg')
            if x == -1 and y == -1:
                findLoginCnt = findLoginCnt - 1
            
        while True:
            list = [
                const.publicPath() + 'bmp/login-btn.jpg', # 登录按钮
                const.publicPath() + 'bmp/get_items.bmp', # 收到物品
                const.publicPath() + 'bmp/salvage.jpg', # 收到新船
                const.publicPath() + 'bmp/home.jpg', # home键
                const.publicPath() + 'beacon/beacon_home.jpg', # 大世界里的home键
                const.publicPath() + 'bmp/i_known.jpg', # 大世界通知弹框
                const.publicPath() + 'bmp/quit.jpg', # 右上角红色叉叉
            ]
            x, y, url = util.findMulPicLoop([
                *list,
                const.publicPath() + 'bmp/weigh anchor.jpg', # 主页面的出击
            ])
            if url in list:
                if url == const.publicPath() + 'bmp/salvage.jpg':
                    util.click(200, 200)
                else:
                    util.click(x, y)
                time.sleep(1)
                continue
            elif url == const.publicPath() + 'bmp/weigh anchor.jpg':
                break

        util.logOut(__file__,'restartProcess 重启脚本结束')

    def startAPP(self):
        """ 启动碧蓝航线 """
        util.logOut(__file__,'startAPP 启动脚本开始')
        ret = util.adb('shell "dumpsys activity | grep Run | grep com.bilibili.azurlane"')
        util.logOut(__file__,format(ret))
        if len(ret.stdout) == 0:
            # app没有启动，需要重启
            const.restartProcess(needGrab = False)
        ret = const.backMainProcess()
        if ret == False:
            # 返回主页面失败，那就直接重启
            const.restartProcess(needGrab = False)
        util.logOut(__file__,'startAPP 启动脚本结束')

    def beaconProcess(self, beaconType, skipIntelligence = False):
        """ 信标出击步骤

        :param beaconType: 左边蓝blue 右边棕brown
        :param skipIntelligence: 跳过点击左右蓝棕          默认False - 不跳过
        """
        util.logOut(__file__,'------------信标出击开始-----------')
        if not skipIntelligence:
            if beaconType == 'blue':
                const.picLoop(const.publicPath() + 'beacon/' + 'beacon list.jpg')
            elif beaconType == 'brown':
                const.picLoop(const.publicPath() + 'beacon/' + 'beacon list2.jpg')
            util.click(444, 240) # 中间的情报解析
        x, y = const.picLoop(const.publicPath() + 'operation/' + 'help.jpg')
        util.click(x, y)
        x, y = const.picLoop(const.publicPath() + 'operation/' + 'help1.jpg')
        util.click(x, y)
        x, y = const.picLoop(const.publicPath() + 'operation/' + 'help2.jpg')
        util.click(x, y)
        if beaconType == 'blue':
            x, y = const.picLoop(const.publicPath() + 'operation/' + 'help3.jpg')
            util.click(x, y)
        x, y = const.picLoop(const.publicPath() + 'operation/' + 'OK_ask.jpg')
        util.click(x, y)

        while True:
            x, y, url = const.picMulLoop([
                const.publicPath() + 'beacon/batile start.jpg', # 有的打
                const.publicPath() + 'operation/' + 'collect_beward.jpg', # 没得打
            ])
            if url == const.publicPath() + 'beacon/batile start.jpg':
                time.sleep(2)
                util.click(x, y)
                time.sleep(2)
                # 会莫名其妙点不中，那就多判断一次
                if util.isFindPic(const.publicPath() + 'beacon/batile start.jpg'):
                    util.click(x, y)
            elif url == const.publicPath() + 'operation/' + 'collect_beward.jpg':
                break

            time.sleep(1)
            x, y, url = const.picMulLoop([
                const.publicPath() + 'bmp/anchor.bmp', # 正常出击
                const.publicPath() + 'bmp/quit.jpg', # 自律 今日不再提示
            ])
            if url == const.publicPath() + 'bmp/anchor.bmp':
                util.click(x, y)
            elif url == const.publicPath() + 'bmp/quit.jpg':
                util.click(x, y)
                util.logOut(__file__,'今日不再提示')
                x, y = const.picLoop(const.publicPath() + 'bmp/anchor.bmp')
                util.click(x, y)

            x, y, url = const.picMulLoop([
                const.publicPath() + 'beacon/complete.jpg', # 正常完成
                const.publicPath() + 'beacon/beacon list.jpg', # 奇怪的完成 蓝色
                const.publicPath() + 'beacon/beacon list2.jpg', # 奇怪的完成 棕色
            ])
            if url == const.publicPath() + 'beacon/complete.jpg':
                time.sleep(2)
                # 确定按钮变成了半透明，这个是确定按钮的位置
                util.click(736, 450)
            elif url == const.publicPath() + 'beacon/beacon list.jpg':
                pass
            elif url == const.publicPath() + 'beacon/beacon list2.jpg':
                pass

        x, y = const.picLoop(const.publicPath() + 'operation/' + 'collect_beward.jpg')
        util.click(x, y)

        x, y, url = const.picMulLoop([
            const.publicPath() + 'bmp/get_items.bmp', # 领取奖励
        ])
        if url == const.publicPath() + 'bmp/get_items.bmp':
            util.click(x, y)

        util.logOut(__file__,'------------信标出击结束-----------')

    def mainBattlelineProcess(
        self,
        CHAPTER_NUM, CHAPTER_NUM2,
        CHAPTER_TYPE,
        CHAPTER_X, CHAPTER_Y,
        isBook=False,
        first=1,
        second=2,
        third=1,
        firstWork=1,
        thirdWork=1,
        cnt=sys.maxsize
    ):
        """ 主线出击步骤

        :param CHAPTER_NUM, CHAPTER_NUM2: 几-几
        :param CHAPTER_TYPE: N - 普通 H - 困难 A - 活动
        :param CHAPTER_X, CHAPTER_Y: 几-几的坐标点
        :param isBook: 是否使用双倍书                     默认True - 使用双倍书
        :param first: 第一个舰队选择 -1不动 0清空          默认1 - 第一队
        :param second: 第二个舰队选择 -1不动 0清空         默认2 - 第二队
        :param third: 潜艇选择 -1不动 0清空               默认1 - 第一队
        :param firstWork: 第一个舰队职责                  默认1 - 道中
        :param thirdWork: 潜艇职责                        默认1 - 自动出击
        :param cnt: 出击次数                     默认sys.maxsize - 基本上就是无限大
        """
        if CHAPTER_TYPE == 'N':
            util.logOut(__file__,'普通'+str(CHAPTER_NUM)+'-'+str(CHAPTER_NUM2)+'开始')
        if CHAPTER_TYPE == 'H':
            util.logOut(__file__,'困难'+str(CHAPTER_NUM)+'-'+str(CHAPTER_NUM2)+'开始')
            cnt = 3
        elif CHAPTER_TYPE == 'A':
            util.logOut(__file__,'活动刷图开始')

        # 进入选关界面
        if CHAPTER_TYPE == 'A':
            util.logOut(__file__,'chapterProcess 进入活动出击章节步骤开始')
            #返回主页面
            const.backMainProcess()
            #进入出击界面
            x, y = const.picLoop(const.publicPath() + 'activity/into.jpg', threshold=0.6)
            util.click(x, y)

            x, y, url = const.picMulLoop([
                const.publicPath() + 'activity/activity_chapter.jpg', # 活动选关
                const.publicPath() + 'bmp/withdraw.jpg', # 在图里
            ])
            if url == const.publicPath() + 'activity/activity_chapter.jpg':
                pass
            elif url == const.publicPath() + 'bmp/withdraw.jpg':
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
                util.click(x, y)
                const.backMainProcess()
                x, y = const.picLoop(const.publicPath() + 'activity/into.jpg', threshold=0.6)
                util.click(x, y)
            const.picLoop(const.publicPath() + 'activity/activity_chapter.jpg')

            util.logOut(__file__,'chapterProcess 进入活动出击章节步骤结束')
        else:
            const.chapterProcess(CHAPTER_NUM, CHAPTER_TYPE)
        
        # 判断每日几次 困难特有
        if CHAPTER_TYPE == 'H':
            list = util.getNumbers((60, 407, 93, 429))
            if len(list) > 0:
                cnt = int(list[0][0])

        playCnt = 0 # 游玩次数
        for i in range(cnt):
            playCnt += 1
            if playCnt != 1:
                if CHAPTER_TYPE != 'A' and not util.isFindPic(const.publicPath() + 'bmp/exercise.jpg'):
                    # 不是第一次的话，简化版本的chapterProcess
                    # 优化：得不在选关界面
                    const.backMainProcess()
                    x, y = const.picLoop(const.publicPath() + 'bmp/weigh anchor.jpg')
                    util.click(x, y)
                    x, y = const.picLoop(const.publicPath() + 'bmp/main battleline.jpg')
                    util.click(x, y)
                    const.picLoop(const.publicPath() + 'bmp/exercise.jpg')
                elif CHAPTER_TYPE == 'A' and not util.isFindPic(const.publicPath() + 'activity/activity_chapter.jpg'):
                    # 活动的话不太一样
                    const.backMainProcess()
                    x, y = const.picLoop(const.publicPath() + 'activity/into.jpg', threshold=0.6)
                    util.click(x, y)
                    const.picLoop(const.publicPath() + 'activity/activity_chapter.jpg')

            # 进入
            util.logOut(__file__,'-------------第'+str(playCnt)+'局开始------------')
            if playCnt == 1:
                const.intoStageProcess(
                    xx = CHAPTER_X, yy = CHAPTER_Y, 
                    first = first, second = second, 
                    isWeek = True, 
                    isBook = isBook,
                    third = third, 
                    firstWork = firstWork, 
                    thirdWork = thirdWork
                )
            else:
                # 第二次不做判断，直接进去了
                util.click(CHAPTER_X, CHAPTER_Y)
                x, y = const.picLoop(const.publicPath() + 'bmp/start chapter.jpg')
                util.click(x,y)
                time.sleep(2)
                x, y = const.picLoop(const.publicPath() + 'bmp/start chapter.jpg')
                time.sleep(1)
                util.click(x,y)

            util.logOut(__file__,'红脸判断 开始')
            time.sleep(1.000)
            list = util.getWords((237, 201 , 627, 263))
            if len(list) != 0 and '低心情' in list[0]:
                util.logOut(__file__,'红脸')
                util.logOut(__file__,'-------------第'+str(playCnt)+'局结束-------------')
                util.logOut(__file__,'等待30分钟，回心情...')
                time.sleep(60*30)
                const.backMainProcess()
                i = i - 1
                continue

            x, y, url = const.picMulLoop([
                const.publicPath() + 'bmp/OK.jpg', # 判断红脸
                const.publicPath() + 'bmp/death.jpg', # 打不过死了
                const.publicPath() + 'bmp/again.jpg', # 正常退出
            ], 60*15)
            if url == const.publicPath() + 'bmp/OK.jpg': # 判断红脸
                isRedFace = False
                util.logOut(__file__,'红脸判断 开始')
                list = util.getWords((237, 201 , 627, 263))
                if len(list) != 0:
                    for m in list:
                        if '低心情' in m:
                            isRedFace = True
                            break
                if isRedFace:
                    util.logOut(__file__,'红脸 退出战斗')
                    x, y = const.picLoop(const.publicPath() + 'bmp/quit.jpg')
                    util.click(x, y)
                    x, y = const.picLoop(const.publicPath() + 'bmp/withdraw.jpg')
                    util.click(x, y)
                    x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
                    util.click(x, y)
                    x, y = const.picLoop(const.publicPath() + 'bmp/leave.jpg')
                    util.click(x, y)
                    util.logOut(__file__,'-------------第'+str(playCnt)+'局结束-------------')
                    util.logOut(__file__,'等待30分钟，回心情...')
                    time.sleep(60*30)
                    const.backMainProcess()
                    i = i - 1
                    continue
                else:
                    x, y = util.findPic(const.publicPath() + 'bmp/oil_less.jpg')
                    if x!=-1 and y!=-1:
                        # 没有油了
                        util.logOut(__file__,'-------------第'+str(playCnt)+'局结束-------------')
                        util.logOut(__file__,'没有石油了，脚本结束')
                        const.backMainProcess()
                        return
            elif url == const.publicPath() + 'bmp/again.jpg': # 正常退出
                pass
            elif url == const.publicPath() + 'bmp/death.jpg': # 打不过死了
                util.logOut(__file__,'打不过死了')
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/quit.jpg')
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/withdraw.jpg')
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/OK.jpg')
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/leave.jpg')
                util.click(x, y)
                const.backMainProcess()
                util.logOut(__file__,'-------------第'+str(playCnt)+'局结束-------------')
                i = i - 1
                continue

            util.logOut(__file__,'-------------第'+str(playCnt)+'局结束-------------')
            x, y = const.picLoop(const.publicPath() + 'bmp/leave.jpg')
            util.click(x, y)

            # 退役操作 普通、活动特有
            if CHAPTER_TYPE == 'N' or CHAPTER_TYPE == 'A':
                time.sleep(2)
                const.backMainProcess()
                x, y = const.picLoop(const.publicPath() + 'bmp/build.jpg')
                util.click(x, y)
                x, y = const.picLoop(const.publicPath() + 'bmp/build_retire.jpg')
                util.click(x, y)
                if playCnt == 1:
                    const.retireProcess(third = 3)
                else:
                    const.retireProcess(third = 3, skipOption = True)

        const.backMainProcess()

const = Const()